Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

453
Visualizações
¿Por qué Firebase Query [ ] a pesar de async/await?

Todavía me cuesta entender cómo extraer valores de una consulta de Firestore y ponerlos en una variable global. Entiendo (ahora) que la naturaleza asincrónica significa que el código no se ejecuta en el orden en que se escribe. Pero, ¿por qué user aún no está definido en el siguiente bloque de código a pesar de la palabra clave await dentro de una función async ? Entiendo (según esta pregunta ) que await debe aplicarse solo hasta get() , de lo contrario, es posible que no haya valores para iterar.

Mi pregunta es similar a esta , pero me encuentro con el mismo problema que el comentario y parece que la pregunta nunca se marcó como respondida. También es similar a esto , pero presionar todo llega a una Promesa y luego resolver esa promesa aún no asignó los datos a una variable. Simplemente imprimió una matriz vacía.

Puedo imprimir la variable, por lo que creo que mi pregunta es sobre la asignación. Esta función es un controlador para un Intent en DialogFlow . Prefiero tener los datos disponibles fuera de la llamada a la base de datos. Agregar a las respuestas del agente en una llamada a firestore no siempre agrega el texto al agente, por lo que me gustaría evitar eso.

 async function loginHandler(agent){ username = agent.parameters.username.name; password = agent.parameters.password; const user = await db.collection("users") .where("name","==",username) .where("password","==",password) .limit(1) .get() .then(querySnapshot =>{ querySnapshot.forEach(docSnapShot =>{ return docSnapShot.data(); //console.log.(docSnapShot.data()); //prints correct contents, so error is in programming logic agent.add("Response"); // Would prefer to avoid this, but could refactor if I am fundamentally misunderstanding how to access Firebase data }) }) .catch(error => console.log); console.log(user); console.log("bort"); }

Imagen de Firestore para demostrar que existen los datos correctos:

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

forEach itera los resultados pero no devuelve nada, por lo que su return dentro no está haciendo lo que esperaría ( forEach devuelve void , por lo que está devolviendo la instantánea a una función que devuelve void ). Puede crear una variable local para contener los resultados que itera y luego devolver eso:

 const user = await db.collection("users") .where("name","==",username) .where("password","==",password) .limit(1) .get() .then(querySnapshot =>{ // Set up an empty array to return later let data = [] querySnapshot.forEach(docSnapShot =>{ // Add each snapshot's data object to the array data = [...data, ...docSnapShot.data()] }) // Return `data` which will populate `user` return data }) .catch(error => console.log);
about 4 years ago · Juan Pablo Isaza Relatório

0

Es posible que pueda dividir el código. Primero devuelva los datos de la base de datos, luego map los datos para extraer los detalles y luego asigne ese resultado a la variable de user .

 async function loginHandler(agent) { username = agent.parameters.username.name; password = agent.parameters.password; // `await` the promise and assign it to // `querySnapshot` const querySnapshot = await db.collection('users') .where('name', '==', username) .where('password', '==', password) .limit(1) .get() .catch(error => console.log); const user = querySnapshot.docs.map(docSnapShot => { agent.add('Response'); return docSnapShot.data(); }); console.log(user); }

about 4 years ago · Juan Pablo Isaza Relatório

0

¿Has comprobado cuál es la respuesta correcta?

Aclare si quiere decir undefined como dice en el título o empty array como dice en el texto.

Tu código me parece correcto. No esperaría que la salida de console.log(user) no esté undefined . Sin embargo, una lista vacía [ ] sería una respuesta perfectamente razonable.

¿Quizás no hay nadie en esa colección con ese nombre de usuario y contraseña?

¿Has probado a quitar la condición de igualdad de usuario y contraseña? Eso debería darle un elemento de la colección, si no está completamente vacío.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda